package sqlitemodel

import (
	"gitlab.local/TerraMaster/tos-modules/quotactl"
	"time"
)

// Share share表字段结构体 插入时重新创建结构体从一下选取所需字段
type Share struct {
	FolderId         int    `json:"folder_id" gorm:"primary_key;auto_increment"`
	FolderName       string `json:"folder_name" gorm:"type:text;column:foldername;unique;"`
	Device           string `json:"device" gorm:"type:text;column:device;default:''"`
	MntPath          string `json:"mnt_path" gorm:"type:text;column:mntpath;default:''"`
	Owner            string `json:"owner" gorm:"type:text;column:owner;default:''"`
	OpLock           int    `json:"op_lock" gorm:"column:oplock;default:0"`
	Hidden           int    `json:"hidden" gorm:"column:hidden;default:0"`
	Type             string `json:"type" gorm:"type:text;column:type;default:''"`
	Description      string `json:"description" gorm:"type:text;column:description;default:''"`
	Recycle          int    `json:"recycle" gorm:"column:recycle;default:0"`
	SaveDays         int    `json:"save_days" gorm:"column:savedays;default:20"`
	Ecryptfs         int    `json:"ecryptfs" gorm:"column:ecryptfs;default:0"` //是否被加密，1是，0否
	Rsync            int    `json:"rsync" gorm:"column:rsync;default:0"`
	TimeMachine      int    `json:"time_machine" gorm:"column:timemachine;default:0"`
	QuotaFlag        int    `json:"quota_flag" gorm:"type:integer;not null;column:quota_flag;default:0"` //共享文件夹配额开启标志：-1禁用，0关闭，1启用
	Quota            int    `json:"quota" gorm:"column:quota;default:0;"`
	Extend           string `json:"extend" gorm:"type:text;column:extend;default:''"`
	TimeMachineLimit string `json:"time_machine_limit" gorm:"column:time_machine_limit;default:''"` //timeMachine容量限制
	USB              string `json:"usb" gorm:"type:text;column:usb;default:''"`
}

type GroupUsers struct {
	GroupName string `gorm:"type:text;column:groupname;not null"`
	UserName  string `gorm:"type:text;column:username;not null"`
	Hash      string `gorm:"type:text;column:hash;not null;unique"`
}

type Member struct {
	Username          string    `gorm:"type:text;column:username;unique;primary_key" json:"username"`
	Password          string    `gorm:"type:text;column:password;not null" json:"password"`
	Email             string    `gorm:"type:text;column:email;default:''" json:"email"`
	Phone             string    `gorm:"type:text;column:phone_number;default:''" json:"phone"`
	QuotaSize         int       `gorm:"-" json:"quota_size"`
	CloudActive       int       `gorm:"type:int;column:cloudactive;default:0" json:"cloud_active"`
	Remarks           string    `gorm:"type:text;column:remarks;default:''" json:"description"`
	Alias             string    `gorm:"type:text;column:alias;default:''" json:"alias"`
	OTPSecret         string    `gorm:"type:text;column:otp_secret;default:''" json:"otp_secret"`
	BindMobile        string    `gorm:"type:text;column:bind_mobile;default:''" json:"bind_mobile"`
	BindTime          string    `gorm:"type:text;column:bind_time;default:''" json:"bind_time"`
	LastPwdChangeTime time.Time `gorm:"column:last_pwd_change_time;" json:"last_pwd_change_time"` //最近修改密码时间
	IsNvr             bool      `gorm:"column:is_nvr;default:false" json:"is_nvr"`                //是否是nvr用户
}

type AclList struct {
	UserName string `gorm:"type:text;column:username;not null" json:"username"`
	ID       int    `gorm:"column:folder_id;not null" json:"id"`
	Access   int    `gorm:"column:access;not null" json:"access"`
	AclType  int    `gorm:"column:acl_type;default:0" json:"acl_type"`
	Hash     string `gorm:"type:text;column:hash;unique;not null"`
	ObjectId int    `gorm:"column:object_id;"` // 当用户被删除时,acl中的用户名将变为 uid,这时只能通过 uid 删除
}

type UserTable struct {
	Member
	Role      string               `gorm:"-" json:"role"`
	GroupList []string             `gorm:"-" json:"groups"`
	QuotaList []quotactl.UserQuota `gorm:"-" json:"quota_list"`
	Acls      []Acl                `gorm:"-" json:"acls"`
}

type Trust struct {
	ID        int    `gorm:"column:id;primary_key;auto_increment;" json:"id"`
	System    string `gorm:"type:varchar(128);column:system" json:"system"`
	Browser   string `gorm:"type:varchar(128);column:browser" json:"browser"`
	Username  string `gorm:"type:text;column:username;" json:"username"`
	ClientIP  string `gorm:"type:text;column:clientIp" json:"clientIp"`
	Cookie    string `gorm:"type:varchar(128);column:cookie" json:"cookie"`
	CreatedAt string `gorm:"type:TEXT;column:created_at;not null" json:"created_at"`
}

type AppAccessUser struct {
	ID       int    `gorm:"column:id;primary_key;auto_increment" json:"id"`
	AppId    string `gorm:"type:varchar(255);column:app_id" json:"app_id"`
	Username string `gorm:"type:text;column:username;not null;" json:"username"`
	IsAllow  int    `gorm:"type:integer;column:is_allow" json:"is_allow"` // 1:允许   0:禁止
}

type GroupTable struct {
	Member
	UserList []string `gorm:"-" json:"user_list"`
	Acls     []Acl    `gorm:"-" json:"acls"`
}

type Acl struct {
	ID         int    `json:"id"`         //共享目录id
	AclType    int    `json:"acl_type"`   //acl的类型
	Name       string `json:"name"`       //共享目录名
	Path       string `json:"path"`       //共享目录路径
	Permission string `json:"permission"` //设置权限
	Effective  string `json:"effective"`  //实际权限
}

// ShareConfig 分享文件配置表
type ShareConfig struct {
	Id               int       `gorm:"column:id;primary_key;auto_increment;" json:"id"`                        //id
	PathsId          string    `gorm:"type:TEXT;column:paths_id;not null" json:"paths_id"`                     //SharePath表id，逗号分隔
	Title            string    `gorm:"type:TEXT;column:title;not null" json:"title"`                           //分享标题
	StaTime          time.Time `gorm:"column:sta_time;not null" json:"sta_time"`                               //开始时间
	ExpTime          time.Time `gorm:"column:exp_time;not null" json:"exp_time"`                               //到期时间
	Password         string    `gorm:"type:TEXT;column:password;not null" json:"password"`                     //提取密码
	BanDownload      bool      `gorm:"type:bool;column:ban_download;not null" json:"ban_download"`             //禁止下载
	ShareLink        string    `gorm:"type:TEXT;column:share_link;not null" json:"share_link"`                 //分享链接参数
	ViewCount        int       `gorm:"type:INT;column:view_count;not null" json:"view_count"`                  //浏览次数
	DownloadCount    int       `gorm:"type:INT;column:download_count;not null" json:"download_count"`          //下载次数
	AllowVisitNum    int       `gorm:"type:INT;column:allow_visit_num;not null" json:"allow_visit_num"`        //允许访问次数,-1为无限制
	BanDelete        bool      `gorm:"type:bool;column:ban_delete;not null" json:"ban_delete"`                 //禁止删除
	BanAdd           bool      `gorm:"type:bool;column:ban_add;not null" json:"ban_add"`                       //禁止添加
	CloseStatus      bool      `gorm:"type:bool;column:close_status;not null" json:"close_status"`             //关闭状态
	User             string    `gorm:"type:TEXT;column:user;not null" json:"user"`                             //所属用户
	RemoteSharDomain string    `gorm:"type:TEXT;column:remote_shar_domain;not null" json:"remote_shar_domain"` //远程访问域名
	CreateData       time.Time `gorm:"column:create_data;not null" json:"create_data"`                         //创建时间
	Tag              string    `gorm:"column:tag;not null" json:"tag"`                                         //标签
}

type SharePath struct {
	Id         int       `gorm:"column:id;primary_key;auto_increment;" json:"id"`   //id
	Path       string    `gorm:"type:TEXT;column:path;unique;not null" json:"path"` //分享路径
	CreateData time.Time `gorm:"column:create_data;not null" json:"create_data"`    //创建时间
}

// ShareCrypt CREATE TABLE share_config(id INTEGER PRIMARY KEY autoincrement NOT NULL, path TEXT NOT NULL, user TEXT NOT NULL, title TEXT  default "" NOT NULL, exp_time datetime default "" NOT NULL, share_link TEXT default "" NOT NULL, password TEXT  default "" NOT NULL, ban_download BLOB  default false NOT NULL, view_count INT  default 0 NOT NULL, download_count INT default "" NOT NULL, allow_visit_num INT default -1 NOT NULL, local_share_domain TEXT default "" NOT NULL, remote_shar_domain TEXT default "" NOT NULL, create_data datetime NOT NULL);
// CREATE UNIQUE INDEX path_title on share_config (path, user);
type ShareCrypt struct {
	FolderID    int    `gorm:"type:INT;column:folder_id;primary_key;auto_increment;not null;" json:"folder_id"`
	Passphrase  string `gorm:"type:TEXT;column:passphrase;not null;" json:"passphrase"`
	Passtip     string `gorm:"type:TEXT;column:passtip;" json:"passtip"`
	EcryptfsSig string `gorm:"type:TEXT;column:ecryptfs_sig;not null;" json:"ecryptfs_sig"`
}

// ExternalAcl id  device(/dev/sdb)   用户(root) 用户组(root) 文件路径(/etc/a) 类型(usb...) 权限(rwx,---,r-x)
type ExternalAcl struct {
	Id        int       `gorm:"column:id;primary_key;auto_increment;" json:"id"`
	UserTable UserTable `gorm:"ForeignKey:User;AssociationForeignKey:Username;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"-"`
	User      string    `gorm:"type:text;column:username;" json:"user"`
	Group     string    `gorm:"type:text;column:groupname;" json:"group"`
	Path      string    `gorm:"type:text;column:path;not null" json:"path"`
	Type      string    `gorm:"type:text;column:type;not null" json:"type"`
	Acl       string    `gorm:"type:text;column:acl;not null" json:"acl"`
	UUID      string    `gorm:"type:text;column:uuid;" json:"uuid"`
	Timestamp int64     `gorm:"type:int8;column:timestamp;" json:"timestamp"`
}

// FileRecently 文件最近访问表
type FileRecently struct {
	ID         int       `gorm:"column:id;primary_key;auto_increment;comment:id;" json:"id"`
	Path       string    `gorm:"type:varchar(65535);column:path;not null;index:file_recently_path_idx;comment:文件路径;"  json:"path"`
	UserName   string    `gorm:"type:varchar(255);column:user_name;not null;index:file_recently_user_name_idx;comment:用户;"  json:"user_name"`
	CreateTime time.Time `gorm:"column:create_time;not null;comment:添加时间;" json:"create_time"`
}
